package io.github.wangtisnruipopo.carscore.types;

import java.util.List;

/**
 * <h1>游戏管理接口</h1>
 *
 * @param <S> 卡牌套装类型
 */
public interface IGame<
        D extends AbsDecorValue,
        V extends AbsCardValue,
        C extends ISimpleCard<D, V>,
        S extends ISuitCards<D, V, C>,
        P extends IPlayer<D, V, C>,
        R extends IPlayCardsRecord<D, V, ? extends IPlayCardsType<C>, C, P>,
        O extends IRound<D, V, C, P, R>> {
    /**
     * <h2>创建游戏对局</h2>
     */
    void create();

    /**
     * <h2>创建游戏套牌</h2>
     */
    void createSuitCards();

    /**
     * <h2>开始游戏</h2>
     */
    void start();

    /**
     * <h2>发牌逻辑</h2>
     */
    void deal();

    /**
     * <h2>获取本局游戏id</h2>
     *
     * @return 本局游戏id
     */
    String getId();

    /**
     * <h2>获取本局游戏玩家集合</h2>
     *
     * @return 游戏玩家集合
     */
    List<P> getPlayers();

    /**
     * <h2>向本局游戏中添加玩家</h2>
     *
     * @param player 被添加的玩家
     */
    void addPlayer(P player);

    /**
     * <h2>获取本局游戏卡牌套装</h2>
     *
     * @return 卡牌套装
     */
    S getSuitCards();

    /**
     * <h2>获取游戏状态</h2>
     * @return 游戏状态：正式开始返回true，准备中返回false
     */
    boolean isStatus();

    /**
     * <h2>获取游戏是否结束</h2>
     * @return 游戏结束返回true，否则返回false
     */
    boolean isEnd();

    /**
     * <h2>获取本局游戏的所有回合</h2>
     * @return 回合集合
     */
    List<O> getRounds();

    /**
     * <h2>创建新的集合</h2>
     */
    void addRound();
}
